const fs = require("fs");
let  join = require('path').join;
const gulp = require("gulp");
//启动服务器（并能时时同步）
const connect = require("gulp-connect");
//合并文件
const concat = require("gulp-concat");
//编译scss文件为css
const sass = require('gulp-sass');
sass.compiler = require('node-sass');
//压缩js文件
const uglify = require('gulp-uglify');
//压缩sass文件
let cleanCSS = require('gulp-clean-css');
//新语法转换插件（es6及以上转换为es5）
const babel = require("gulp-babel");
const proxy = require('http-proxy-middleware');



//监听多个js文件
function watchJs(json,prefix = "js-"){
	for(let attr in json){
		gulp.watch(json[attr].src+"*.js",[prefix+attr]);
	}
}
//监听多个scss文件
function watchScss(json,prefix = "scss-"){
	for(let attr in json){
		gulp.watch(json[attr].src+"*.scss",[prefix+attr]);
	}
}

//定义将js文件复制到dev工作文件夹中的命令(循环变量产生命令)
function mergeMyjs(json,prefix = "js-",mode="dev"){
	let jsTaskArray = []
	for(let attr in json){
		jsTaskArray.push(prefix+attr);
		if(mode == "dev"){
			devJsMode(json,prefix,mode,attr);
		}else if(mode == "dist"){
			distJsMode(json,prefix,mode,attr)
		}
	}
	return jsTaskArray;
}
//开发环境下的部署
function devJsMode(json,prefix,mode,attr){
	gulp.task(prefix+attr,function(){
			return gulp.src([json[attr].src+"*.js"])//文件路径
						.pipe(concat(attr+".js"))//合并文件
						.pipe(gulp.dest("./"+mode+"/js"))//拷贝文件
						.pipe(connect.reload());//页面刷新
		})
}
//生产环境下的部署
function distJsMode(json,prefix,mode,attr){
	gulp.task(prefix+attr,function(){
			return gulp.src([json[attr].src+"*.js"])//路径
						.pipe(concat(attr+".js"))//合并
						.pipe(babel({
							presets: ['@babel/env']
						}))//将es6及以上语法转换为es5
						.pipe(uglify())//压缩
						.pipe(gulp.dest("./"+mode+"/js"))//复制
		})
}

//定义将scss文件复制到dev工作文件夹中的命令(循环变量产生命令)
function mergeMyscss(json,prefix = "scss-",mode="dev"){
	let scssTaskArray = [];
	for(let attr in json){
		scssTaskArray.push(prefix+attr);
		if(mode == "dev"){
			devScssMode(json,prefix,mode,attr);
		}else if(mode == "dist"){
			distScssMode(json,prefix,mode,attr)
		}
	}
	return scssTaskArray;
}
//开发环境下的部署
function devScssMode(json,prefix,mode,attr){
	gulp.task(prefix+attr,function(){
			return gulp.src([json[attr].src+"*.+(scss|sass)"])
						.pipe(concat(attr+".scss"))
						.pipe(sass().on("error",sass.logError))//报错不停止（不加会终止程序）
						.pipe(gulp.dest("./"+mode+"/css"))
						.pipe(connect.reload());
		})
}
//生产环境下的部署
function distScssMode(json,prefix,mode,attr){
	gulp.task(prefix+attr,function(){
			return gulp.src([json[attr].src+"*.+(scss|sass)"])
						.pipe(concat(attr+".scss"))
						.pipe(sass())
						.pipe(cleanCSS({debug: true}, (details) => {
                              console.log(`${details.name}: ${details.stats.originalSize}`);
                              console.log(`${details.name}: ${details.stats.minifiedSize}`);
                          }))
						.pipe(gulp.dest("./"+mode+"/css"))
		})
}

function getProxy(proxyList){
    let result = [];
    for(let attr in proxyList) {
          let options = {
                target : proxyList[attr].url,
                changeOrigin : true ,
                pathRewrite : !proxyList[attr].rewrite ? {
                      ["^"+attr] : ""
                } : {}
          };
          result.push( proxy ( attr , options) )
    }
   return result;
}

//读取文件路径功能;
function findFilePath(startPath) {
      let result=[];
      function finder(path) {
          let files=fs.readdirSync(path);
          files.forEach((val,index) => {
              let fPath=join(path,val);
              let stats=fs.statSync(fPath);
              if(stats.isDirectory()) finder(fPath);
              if(stats.isFile()) result.push(fPath);
          });
  
      }
      finder(startPath);
      return result;
}
module.exports = {
			findFilePath,
			watchJs,
			watchScss,
			mergeMyjs,
			mergeMyscss,
			getProxy,
}
